package cn.fntop.handler;

import cn.fntop.config.TenantConfigProperties;
import cn.fntop.context.TenantContextHolder;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import net.sf.jsqlparser.expression.NullValue;

/**
 * 租户核心处理器
 */
@Slf4j
public class TenantHandler implements TenantLineHandler {
    private TenantConfigProperties properties;

    public TenantHandler(TenantConfigProperties properties) {
        this.properties = properties;
    }


    @Override
    public Expression getTenantId() {
        Integer tenantId = TenantContextHolder.getTenantId();
        log.info("获取租户ID >> {}", tenantId);
        if (tenantId == null) {
            return new NullValue();
        }
        return new LongValue(tenantId);
    }

    /**
     * 获取租户字段名
     *
     * @return
     */
    @Override
    public String getTenantIdColumn() {
        return properties.getColumn();
    }

    /**
     * 根据表名判断是否忽略拼接多租户条件
     * 默认都要进行解析并拼接多租户条件
     *
     * @param tableName 表名
     * @return true 忽略拼接多租户条件，false 拼接多租户条件
     */
    @Override
    public boolean ignoreTable(String tableName) {
        Integer tenantId = TenantContextHolder.getTenantId();
        // 租户ID为空，返回true，不进行租户隔离
        if (tenantId == null) {
            return Boolean.TRUE;
        }
        return !properties.getTables().contains(tableName);
    }
}